<?php

declare(strict_types=1);

namespace ImiApp\ApiServer\Api\Controller\order;

use Imi\Db\Db;
use Imi\Server\Http\Route\Annotation\Action;
use Imi\Server\Http\Route\Annotation\Controller;
use Imi\Server\Http\Route\Annotation\Route;
use Psr\Http\Message\ResponseInterface;
use Imi\Aop\Annotation\Inject;
// use Phpben\Imi\Validate\Annotation\Validate;
use Phpben\Imi\Auth\Annotation\Auth;
use Imi\Config;

/**
 * 购物车订单_收藏下单
 * @Auth(name="token",nologin={"no"})
 * @Controller("/order.cart2/")
 */
class Cart2 extends OrderBean
{

    //如果$noNeedLogin为空表示所有接口都需要登录才能请求
    //如果$noNeedRight为空表示所有接口都需要验证权限才能请求
    //如果接口已经设置无需登录,那也就无需鉴权了
    //
    // 无需登录的接口,*表示全部
    protected $noNeedLogin = ['*'];
    // 无需鉴权的接口,*表示全部
    protected $noNeedRight = ['*'];




    /**
     * 创建订单
     *
     * @param string $goods_json
     * @param string $pay_type 支付方式:wechat=微信支付,alipay=支付宝,wallet=钱包支付,score=积分支付,shell=贝壳支付,mix=混合支付
     * @param int $addr_id 收货地址
     * @param string $platform 平台:H5=H5,wxOfficialAccount=微信公众号,wxMiniProgram=微信小程序,App=App
     * @param int $coupons_id 平台优惠券
     * 
     * @Action
     * @return void
     */
    public function create_order($goods_json, $pay_type = 'wallet', $addr_id = null, $platform = 'App', $coupons_id = null, $pay = 0, $shell = 0, $score = 0)
    {
        // var_dump($goods_json, $pay_type, $addr_id, $platform, $coupons_id, $pay, $shell, $score);

        // $goods_json['18'] = ['goods_list' => [['num' => 2, 'goods_sku_price_id' => 150]], 'remark' => '下单备注', 'coupons_id' => 1]; //无多规格
        // $goods_json['1'] = ['goods_list' => [['num' => 1, 'goods_sku_price_id' => 116]], 'remark' => '下单备注']; //无多规格
        // $data['goods_json'] = $goods_json;
        // $data['addr_id'] = $addr_id ?? 10;
        // $data['pay_type'] = $pay_type;
        // $data['platform'] = $platform;

        // // //测试用
        // $goods_json = <<<END
        // {
        //     "goods_json": [
        //                 {
        //             "store_id": 19,
        //             "goods_list": [
        //                 {
        //                     "num": 1,
        //                     "goods_sku_price_id": 37
        //                 },
        //                 {
        //                     "num": 10,
        //                     "goods_sku_price_id": 21
        //                 }

        //             ],
   
        //             "remark": "下单备注like_count_money"
        //         }
        //     ],
        //     "addr_id": 10,
        //     "pay_type": "mix",
        //     "platform": "App",
        //     "shell":10,
        //     "score":10
        // }
        // END;

        // $data = json_decode($goods_json, true); //测试用
        // $this->OrderCreateBefore($data);
        $info_data = $this->CountMoney($data, true);
        $this->OrderCreate($data, $info_data);




        // \think\Hook::listen('order_create_before', $this->reqeust->param());
    }

    /**
     * 订单创建前
     *
     * @param array $params
     * @return void 
     */
    protected function OrderCreateBefore($params)
    {
        //判断优惠券 
        // 调用的是云仓商品不可使用店铺优惠券
        // 合并结算时只能用1张店铺优惠券

        // 先减店铺的优惠券 然后在判断平台的券能否使用
        // 使用最大额度




        //A收藏里面多选下单
        //A-a收藏里面是否是多个店铺下单
        //多个商品和单个商品

        //A-b单店铺下单
        //多商品
        //单商品

        //B直接购买下单就是一个商品



        //判断优惠券是否选择正确
        //判断商品 库存是否足够是否正常 下单
        foreach ($params['goods_json']  as $f_goods_list) {
            $store_id = $f_goods_list['store_id'];
            //一个店铺创建一个订单
            $goods_amount = 0; //店铺商品总价格
            $goods_list = $f_goods_list['goods_list'];


            foreach ($goods_list as $key => $val) {
                // $goods_id = $val['goods_id'];
                $num = $val['num'];
                $goods_sku_price_id = $val['goods_sku_price_id'];
                $goods_sku_price_data = $this->GetGoodsIsCreateOrder($goods_sku_price_id, $num); //获取商品是否可以创建订单
                $goods_amount = $goods_amount + $goods_sku_price_data['price'] * $num;
            }

            $store_arr[$store_id]['total_amount'] = $goods_amount; //该店铺总价
            //判断优惠券是否可以使用


        }
    }


    /**
     * 收藏计算价格和优惠券
     *
     * @param string $goods_json
     * @param string $pay_type 支付方式:wechat=微信支付,alipay=支付宝,wallet=钱包支付,score=积分支付,shell=贝壳支付,mix=混合支付
     * @param int $addr_id 收货地址
     * @param string $platform 平台:H5=H5,wxOfficialAccount=微信公众号,wxMiniProgram=微信小程序,App=App
     * @param int $coupons_id 平台优惠券
     * @param float $shell 贝壳
     * @param float $score 积分
     * @Action
     * @return void
     */
    public function like_count_money($goods_json = null, $pay_type = 'wallet', ?int $addr_id = null, $platform = 'App', ?int $coupons_id = null, ?float $pay = 0, ?float $shell = 0, ?float $score = 0)
    {


        // $goods_json = <<<END
        // {
        //     "goods_json": [
        //                 {
        //             "store_id": 1,
        //             "goods_list": [
        //                 {
        //                     "num": 1,
        //                     "goods_sku_price_id": 116
        //                 }
        //             ],
        //             "coupons_id":2,
        //             "remark": "下单备注like_count_money"
        //         },
        //         {
        //             "store_id": 19,
        //             "goods_list": [
        //                 {
        //                     "num": 2,
        //                     "goods_sku_price_id": 1
        //                 }
        //             ],
        //             "remark": "下单备注like_count_money"
        //         }  
        //     ],
        //     "coupons_id":0,
        //     "addr_id": 10,
        //     "pay_type": "wechat",
        //     "platform": "App"
        // }
        // END;

        // return $this->success('',json_decode($goods_json,true));
        $goods_json = json_decode($goods_json, true); //测试用
        if (!$goods_json) {
            return $this->error('数据错误', $goods_json);
        }
        // return $this->success('计算价格', $this->OrderCountMoney($goods_json));    ////测试用
        $data['goods_json'] = $goods_json;
        $data['addr_id'] = $addr_id ?? 10;
        $data['pay_type'] = $pay_type;
        $data['platform'] = $platform;
        if($coupons_id)
        $data['coupons_id'] = $coupons_id ?? 0;
        $data['shell'] = $shell ? $shell : 0;
        $data['score'] = $score ? $score : 0;
        // return $this->success('',$data);
        // var_dump($data);
        return $this->success('计算价格', $this->OrderCountMoney($data));
    }





    /**
     * 测试收藏计算价格和优惠券
     *
     * @Action
     * @return void
     */
    public function test_like_count_money()
    {

        $goods_json = <<<END
        {
            "goods_json": [
                        {
                    "store_id": 1,
                    "goods_list": [
                        {
                            "num": 1,
                            "goods_sku_price_id": 116
                        }
                    ],
                    "coupons_id":2,
                    "remark": "下单备注like_count_money"
                },
                {
                    "store_id": 19,
                    "goods_list": [
                        {
                            "num": 2,
                            "goods_sku_price_id": 1
                        }
                    ],
                    "remark": "下单备注like_count_money"
                }  
            ],
            "addr_id": 10,
            "pay_type": "wechat",
            "platform": "App",
            "score":43.75,
            "shell":83.25
        }
        END;


        $goods_json = json_decode($goods_json, true); //测试用
        return $this->success('测试计算价格', $this->OrderCountMoney($goods_json));    ////测试用

    }




    /**
     * 订单计算金额
     *
     * @param array $params
     * @return void 
     */
    protected function OrderCountMoney($params)
    {
        //判断优惠券 
        // 调用的是云仓商品不可使用店铺优惠券
        // 合并结算时只能用1张店铺优惠券

        // 先减店铺的优惠券 然后在判断平台的券能否使用
        // 使用最大额度




        //A收藏里面多选下单
        //A-a收藏里面是否是多个店铺下单
        //多个商品和单个商品

        //A-b单店铺下单
        //多商品
        //单商品

        //B直接购买下单就是一个商品



        //判断优惠券是否选择正确
        //判断商品 库存是否足够是否正常 下单
        $第一次计算后的价格信息 = $this->CountMoney($params, true);
        $sys_coupons_money = 0; //平台优惠金额
        $平台优惠占比 = 0;
        if ($第一次计算后的价格信息['sys_coupons']) {
            //如果存在系统优惠券计算 每件商品单价
            $sys_coupons_money = (float)$第一次计算后的价格信息['sys_coupons']['jian'];
            //金额占比
            //  = 优惠总金额/平台没有优惠商品总价 ;
            // var_dump($sys_coupons_money,$第一次计算后的价格信息['before_goods_amount']);
            $平台优惠占比 = $sys_coupons_money / $第一次计算后的价格信息['goods_amount']; // ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️此处的算法是否正确?
            // $this->success($平台优惠占比, $第一次计算后的价格信息);

        }
        $addr_id = $params['addr_id'];


        $运费总价 = 0;
        $店铺总优惠 = 0;
        $订单优惠后总价 = 0;
        $订单商品无优惠总价 = 0;
        $支付方式 = $params['pay_type'];

        $使用钱 = isset($params['pay']) ? $params['pay'] : 0;
        $使用贝壳 =  isset($params['shell']) ? $params['shell'] : 0;
        $使用积分 =  isset($params['score']) ? $params['score'] : 0;


        // if ($使用钱 && $this->auth->money() < $使用钱) {
        //     return $this->error('余额不足',$this->auth->money(),CODE_余额不足);
        // }
        if ($支付方式 == 'mix') {
            if ($使用贝壳 && $this->auth->shell() < $使用贝壳) {
                return $this->error('贝壳不足', $this->auth->shell(), CODE_贝壳不足);
            }
            if ($使用积分 && $this->auth->score() < $使用积分) {
                return $this->error('积分不足', $this->auth->score(), CODE_积分不足);
            }
        }

        //优惠券只计算商品 不含运费,先计算各家的优惠券使用后 最后计算总平台的优惠券是否可以用
        foreach ($params['goods_json']  as $f_goods_list) {
            $store_temp = [];
            $store_id = $f_goods_list['store_id'];
            //一个店铺创建一个订单
            $goods_amount = 0; //店铺商品总价格
            $goods_list = $f_goods_list['goods_list'];

            $优惠价格 = 0;
            $goods_arr_id = []; //商品id数组


            //👉👉👉👉不一样  优惠后/原价
            // $店铺折扣 = $第一次计算后的价格信息['store_arr'][$store_id]['last_goods_amount']/$第一次计算后的价格信息['store_arr'][$store_id]['goods_amount'];
            //$店铺折扣 = 店铺优惠券 / 店铺商品优惠后总金额
            $店铺折扣 = 0;
            if ($第一次计算后的价格信息['store_arr'][$store_id]['coupons']) {
                $店铺折扣 = $第一次计算后的价格信息['store_arr'][$store_id]['coupons']['jian'] / $第一次计算后的价格信息['store_arr'][$store_id]['goods_amount'];
            }

            foreach ($goods_list as $key => &$val) {
                // $goods_id = $val['goods_id'];

                $num = $val['num'];
                $goods_sku_price_id = $val['goods_sku_price_id'];
                $goods_sku_price_data = $this->GetGoodsskuPriceData($goods_sku_price_id); //商品价格
                $val['goodssku_price'] = $goods_sku_price_data;
                $val['goods'] = $this->GetGoodsShortDataById($goods_sku_price_data['goods_id']);
                $goods_amount = $goods_amount + $goods_sku_price_data['price'] * $num;




                //单价商品 =  原价 * 店铺折扣 * 平台折扣;
                if ($sys_coupons_money) {
                    $单价商品 = round($goods_sku_price_data['price'] * (1 - $店铺折扣) * (1 - $平台优惠占比), 2);
                } else {
                    $单价商品 = round($goods_sku_price_data['price'] * (1 - $店铺折扣), 2);
                }
                $val['store_ratio'] = $店铺折扣;
                $val['goods_money'] = $单价商品;
                //👉👉👉👉不一样

                $goods_arr_id[] = $goods_sku_price_data['goods_id'];
            }
            //这里的运费需要重新计算
            $运费 = $this->GetGoodsIdsDispatchAmount($goods_arr_id, $addr_id);

            $store_temp['goods_amount'] = $goods_amount; //该店铺商品总价
            if (isset($f_goods_list['coupons_id'])) {
                $store_temp['coupons'] = $coupons = $this->getStoreCouponIsUse($f_goods_list['coupons_id'], $goods_amount, $this->auth->user()->id, $store_id);
            } else {
                //获取店铺最大额优惠券
                $store_temp['coupons'] = $coupons = $this->getMaxStoreCoupon($goods_amount, $this->auth->user()->id, $store_id); //该店铺商品总价
            }

            if ($coupons) {
                $优惠价格 = $coupons['jian']; //满减优惠券
                $店铺总优惠 = $店铺总优惠 + $优惠价格;
            }
            $store_temp['last_goods_amount'] = $最后商品价格 = $goods_amount - $优惠价格; //优惠后的商品金额
            $store_temp['dispatch_amount'] = $运费;

            $store_temp['total_amount'] = $最后商品价格 + $运费; //该店铺商品总价
            $store_temp['store_id'] = $store_id;
            $store_temp['goods_list'] = $goods_list;
            $store_temp['store'] = $this->getStoreData2($store_id);
            $运费总价 = $运费总价 + $运费;


            $订单优惠后总价 = $订单优惠后总价 + $最后商品价格;
            $订单商品无优惠总价 = $订单商品无优惠总价 + $goods_amount;
            //👉
            $store_arr[] = $store_temp;
        }
        $coupons = null;
        if (isset($params['coupons_id'])) {
            $coupons = $this->getCouponIsUse($params['coupons_id'], $订单优惠后总价, $this->auth->user()->id);
        } else {
            $coupons = $this->getMaxCoupon($订单优惠后总价, $this->auth->user()->id);
        }

        if ($coupons) {
            $订单商品总价 = $订单优惠后总价 - $coupons['jian'];
        } else {
            $订单商品总价 = $订单优惠后总价;
        }
        $max_use_score = $this->UserUsableScore($订单商品总价, $this->auth->user()->set_id, $this->auth->user()->id);
        $score = (float)$this->auth->score();
        if ($max_use_score <= $score) {
            $usable_score = $max_use_score;
        } else {
            $usable_score = $score;
        }

        $使用混合支付后支付金额 = $订单商品总价 - $使用积分 - $使用贝壳;
        if ($使用混合支付后支付金额 < 0) {
            return $this->error('超过可使用贝壳', $使用贝壳, CODE_超过可使用贝壳);
        }
        //👉
        $data = [
            'store_arr' => $store_arr,
            'sys_coupons' => $coupons,
            'store_coupons_money' => $店铺总优惠,
            'goods_amount' => $订单优惠后总价,
            'after_goods_amount' => $订单商品总价,
            'mix_after_goods_amount' => $使用混合支付后支付金额,
            'use_score' => $使用积分,
            'use_shell' => $使用贝壳,
            'before_goods_amount' => $订单商品无优惠总价,
            'dispatch_amount' => $运费总价,
            'all_money' => $订单商品总价 + $运费总价,
            'sys_ratio' => $平台优惠占比,
            'max_use_score' => $max_use_score, //$this->UserUsableScore($订单商品总价, $this->auth->user()->set_id, $this->auth->user()->id),
            'usable_score' => $usable_score,
            'score' => $score,

        ];
        return $data;
    }






    /**
     * 计算总价金额和优惠金额
     *
     * @param array $params
     * @param bool $slfe 内部调用用store_id
     * @return void 
     */
    protected function CountMoney($params, $slfe = false)
    {
        $addr_id = $params['addr_id'];
        $订单商品总价 = 0;
        $运费总价 = 0;
        $店铺总优惠 = 0;
        $订单优惠后总价 = 0;
        $订单商品无优惠总价 = 0;
        $支付方式 = $params['pay_type'];

        $使用钱 = isset($params['pay']) ? $params['pay'] : 0;
        $使用贝壳 =  isset($params['shell']) ? $params['shell'] : 0;
        $使用积分 =  isset($params['score']) ? $params['score'] : 0;
        if ($使用钱 && $this->auth->money() < $使用钱) {
            return $this->error('余额不足', $this->auth->money(), CODE_余额不足);
        }
        if ($支付方式 == 'mix') {
            if ($使用贝壳 && $this->auth->shell() < $使用贝壳) {
                return $this->error('贝壳不足', $this->auth->shell(), CODE_贝壳不足);
            }
            if ($使用积分 && $this->auth->score() < $使用积分) {
                return $this->error('积分不足', $this->auth->score(), CODE_积分不足);
            }
        }


        //优惠券只计算商品 不含运费,先计算各家的优惠券使用后 最后计算总平台的优惠券是否可以用
        foreach ($params['goods_json']  as $f_goods_list) {
            $store_temp = [];
            $store_id = $f_goods_list['store_id'];
            //一个店铺创建一个订单
            $goods_amount = 0; //店铺商品总价格
            $goods_list = $f_goods_list['goods_list'];

            $优惠价格 = 0;
            $goods_arr_id = []; //商品id数组

            foreach ($goods_list as $key => $val) {
                // $goods_id = $val['goods_id'];

                $num = $val['num'];
                $goods_sku_price_id = $val['goods_sku_price_id'];
                $goods_sku_price_data = $this->GetGoodsskuPriceData($goods_sku_price_id); //商品价格
                $goods_amount = $goods_amount + $goods_sku_price_data['price'] * $num;
                $goods_arr_id[] = $goods_sku_price_data['goods_id'];
            }
            $运费 = $this->GetGoodsIdsDispatchAmount($goods_arr_id, $addr_id);

          
            $store_temp['goods_amount'] = $goods_amount; //该店铺商品总价
            if (isset($f_goods_list['coupons_id'])) {
                $store_temp['coupons'] = $coupons = $this->getStoreCouponIsUse($f_goods_list['coupons_id'], $goods_amount, $this->auth->user()->id, $store_id);
            } else {
                //获取店铺最大额优惠券
                $store_temp['coupons'] = $coupons = $this->getMaxStoreCoupon($goods_amount, $this->auth->user()->id, $store_id); //该店铺商品总价
            }

            if ($coupons) {
                $优惠价格 = $coupons['jian']; //满减优惠券
                $店铺总优惠 = $店铺总优惠 + $优惠价格;
            }
            $store_temp['last_goods_amount'] = $最后商品价格 = $goods_amount - $优惠价格; //优惠后的商品金额
            $store_temp['dispatch_amount'] = $运费;

            $store_temp['total_amount'] = $最后商品价格 + $运费; //该店铺商品总价
            $store_temp['store_id'] = $store_id;
            $运费总价 = $运费总价 + $运费;



            $订单优惠后总价 = $订单优惠后总价 + $最后商品价格;
            $订单商品无优惠总价 = $订单商品无优惠总价 + $goods_amount;
            if ($slfe) {
                $store_arr[$store_id] = $store_temp;
            } else {
                $store_arr[] = $store_temp;
            }
        }
        $coupons = null;
        if (isset($params['coupons_id'])) {
            $coupons = $this->getCouponIsUse($params['coupons_id'], $订单优惠后总价, $this->auth->user()->id);
        } else {
            $coupons = $this->getMaxCoupon($订单优惠后总价, $this->auth->user()->id);
        }

        if ($coupons) {
            $订单商品总价 = $订单优惠后总价 - $coupons['jian'];
        } else {
            $订单商品总价 = $订单优惠后总价;
        }

        $max_use_score = $this->UserUsableScore($订单商品总价, $this->auth->user()->set_id, $this->auth->user()->id);
        $score = (float)$this->auth->score();
        if ($max_use_score <= $score) {
            $usable_score = $max_use_score;
        } else {
            $usable_score = $score;
        }
        if ($使用积分 > 0) {
            if ($usable_score < $使用积分)
                return $this->error('超出可使用积分', $usable_score);
        }

        $data = [
            'store_arr' => $store_arr,
            'sys_coupons' => $coupons,
            'store_coupons_money' => $店铺总优惠,
            'goods_amount' => $订单优惠后总价,
            'after_goods_amount' => $订单商品总价,
            'before_goods_amount' => $订单商品无优惠总价,
            'dispatch_amount' => $运费总价,
            'all_money' => $订单商品总价 + $运费总价,
            'max_use_score' => $max_use_score, //$this->UserUsableScore($订单商品总价, $this->auth->user()->set_id, $this->auth->user()->id),
            'usable_score' => $usable_score,
            'score' => $score,
        ];
        return $data;
    }




    /**
     * 订单创建
     *
     * @param array $params
     * @return void 
     */
    protected function OrderCreate($params, $第一次计算后的价格信息 = null)
    {

        //判断优惠券 
        // 调用的是云仓商品不可使用店铺优惠券
        // 合并结算时只能用1张店铺优惠券

        // 先减店铺的优惠券 然后在判断平台的券能否使用
        // 使用最大额度




        //A收藏里面多选下单
        //A-a收藏里面是否是多个店铺下单
        //多个商品和单个商品

        //A-b单店铺下单
        //多商品
        //单商品

        //B直接购买下单就是一个商品



        //判断优惠券是否选择正确

        $addr_id = $params['addr_id'];
        $all_price = 0; //店铺全部价格
        $store_arr = [];
        $order_ids = [];

        $sys_coupons_money = 0; //平台优惠金额
        $平台优惠占比 = 0;
        if ($第一次计算后的价格信息['sys_coupons']) {
            //如果存在系统优惠券计算 每件商品单价
            $sys_coupons_money = (float)$第一次计算后的价格信息['sys_coupons']['jian'];
            //金额占比
            //  = 优惠总金额/平台没有优惠商品总价 ;
            // var_dump($sys_coupons_money,$第一次计算后的价格信息['before_goods_amount']);
            $平台优惠占比 = $sys_coupons_money / $第一次计算后的价格信息['goods_amount']; // ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️此处的算法是否正确?
            // $this->success($平台优惠占比, $第一次计算后的价格信息);

        }

        $运费总价 = 0;
        $店铺总优惠 = 0;
        $订单优惠后总价 = 0;
        $订单商品无优惠总价 = 0;
        $支付方式 = $params['pay_type'];

        $使用钱 = isset($params['pay']) ? $params['pay'] : 0;
        $使用贝壳 =  isset($params['shell']) ? $params['shell'] : 0;
        $使用积分 =  isset($params['score']) ? $params['score'] : 0;
        if ($使用钱 && $this->auth->money() < $使用钱) {
            return $this->error('余额不足', $this->auth->money(), CODE_余额不足);
        }
        if ($支付方式 == 'mix') {
            if ($使用贝壳 && $this->auth->shell() < $使用贝壳) {
                return $this->error('贝壳不足', $this->auth->shell(), CODE_贝壳不足);
            }
            if ($使用积分 && $this->auth->score() < $使用积分) {
                return $this->error('积分不足', $this->auth->score(), CODE_积分不足);
            }
        }


        $addr = $this->GetAddrData($params['addr_id']);
        // 循环店铺 优惠券只计算商品 不含运费,先计算各家的优惠券使用后 最后计算总平台的优惠券是否可以用
        foreach ($params['goods_json']  as $f_goods_list) {
            $store_temp = [];
            $store_id = $f_goods_list['store_id'];
            //一个店铺创建一个订单
            $goods_amount = 0; //店铺商品原总价格
            unset($order);
            $goods_list = $f_goods_list['goods_list'];

            $运费 = 0; //店铺运费
            $coupons = null;

            $优惠价格 = 0; //店铺优惠价格
            $goods_arr_id = []; //商品id数组
            $店铺折扣 = 0;
            // $总折扣 = 1;
            if ($第一次计算后的价格信息['store_arr'][$store_id]['coupons']) {
                $店铺折扣 = $第一次计算后的价格信息['store_arr'][$store_id]['coupons']['jian'] / $第一次计算后的价格信息['store_arr'][$store_id]['goods_amount'];
            }



            //??
            $订单优惠后总价 = $第一次计算后的价格信息['after_goods_amount'];



            foreach ($goods_list as $key => &$val) {

                $goods_id = $val['goods_id'];
                $num = $val['num'];
                $goods_sku_price_id = $val['goods_sku_price_id'];
                $goods_sku_price_data = $this->GetGoodsskuPriceData($goods_sku_price_id); //商品价格
                $val['goods_price_data'] = $goods_sku_price_data;
                $goods_amount = $goods_amount + $goods_sku_price_data['price'] * $num;


                //单价商品 =  原价 * 店铺折扣 * 平台折扣;
                if ($sys_coupons_money) {
                    $单价商品 = round($goods_sku_price_data['price'] * (1 - $店铺折扣) * (1 - $平台优惠占比), 2);
                    $平台优惠店铺商品金额 = round($goods_sku_price_data['price'] * (1 - $店铺折扣) * $平台优惠占比, 2);
                } else {
                    $单价商品 = round($goods_sku_price_data['price'] * (1 - $店铺折扣), 2);
                    $平台优惠店铺商品金额 = 0;
                }


                // $单件使用比例 =  $单价商品  / $第一次计算后的价格信息['after_goods_amount'];

                $单件使用比例 = $单价商品 / $订单优惠后总价;
                $店铺使用总订单比例 = $单价商品*$num / $订单优惠后总价;
                $单件使用积分 = round($使用积分 * $单件使用比例, 2);
                $单件使用贝壳 = round($使用贝壳 * $单件使用比例, 2);

                $val['item_ratio'] = $单件使用比例; //????
                $val['goods_money'] = $单价商品;
                $val['coupon_fee'] = $平台优惠店铺商品金额 * $num; //平台优惠金额
                $val['item_score_fee'] = $单件使用积分;
                $val['item_shell_fee'] = $单件使用贝壳;


                // //这里的运费需要重新计算
                // $dispatch_amount = $this->GetGoodsDispatchAmount($goods_id); //获取商品运费
                // if ($运费 < $dispatch_amount) //获取最大运费
                //     $运费 = $dispatch_amount;
                //这里的运费需要重新计算
                $goods_arr_id[] = $goods_sku_price_data['goods_id'];
            }
            //                //这里的运费需要重新计算
            $order['dispatch_amount'] = $运费 = $this->GetGoodsIdsDispatchAmount($goods_arr_id, $addr_id);

            $order['type'] = 'goods'; //订单类型:goods=商城订单,score=积分商城订单
            $order['order_sn'] = rand_order('Like', $this->auth->user()->id);
            $order['user_id'] = $this->auth->user()->id;
            // $order['activity_type'] = 'activity_type';//

            $order['goods_amount'] = $goods_amount; //商品原价格
            // var_dump("coupons_id", $f_goods_list['coupons_id']);
            if (isset($f_goods_list['coupons_id'])) {
                $store_temp['coupons'] = $coupons = $this->getStoreCouponIsUse($f_goods_list['coupons_id'], $goods_amount, $this->auth->user()->id, $store_id);
            } else {
                //获取店铺最大额优惠券
                $store_temp['coupons'] = $coupons = $this->getMaxStoreCoupon($goods_amount, $this->auth->user()->id, $store_id); //该店铺商品总价
            }

            // var_dump("coupons", $coupons);
            if ($coupons) {

                $优惠价格 = (float)$coupons['jian']; //满减优惠券
                $店铺总优惠 = $店铺总优惠 + $优惠价格;
            }
            $store_temp['last_goods_amount'] = $最后商品价格 = $goods_amount - $优惠价格; //优惠后的商品金额
            $store_temp['dispatch_amount'] = $运费;

            $store_temp['total_amount'] = $最后商品价格 + $运费; //该店铺商品总价
            $store_temp['store_id'] = $store_id;
            $store_temp['goods_list'] = $goods_list;
            $运费总价 = $运费总价 + $运费;


            // $订单优惠后总价 = $订单优惠后总价 + $最后商品价格;
            $订单商品无优惠总价 = $订单商品无优惠总价 + $goods_amount;


            $order['store_coupon_fee'] = $优惠价格; //店铺优惠金额
            $order['coupon_fee'] = $最后商品价格 * $平台优惠占比; //平台优惠金额
            $order['goods_original_amount'] = $goods_amount; //商品原价
            $order['total_fee'] =  $最后商品价格  + $运费总价 - $order['coupon_fee']; //支付金额 优惠后
            $order['total_amount'] = $goods_amount + $运费总价; //订单总金额 无优惠

            //  //pay_type 支付方式:wechat=微信支付,alipay=支付宝,wallet=钱包支付,score=积分支付,shell=贝壳支付,mix=混合支付
            switch ($params['pay_type']) {
                case 'wechat':

                    break;
                case 'alipay':

                    break;
                case 'wallet':
                    $order['pay_fee'] =  round($order['total_fee'] * (1 - $店铺折扣), 2); //实际支付金额 - 扣除积分 -贝壳等!!!!!!!!!!
                    break;
                case 'score':

                    break;
                case 'shell':
                    $order['pay_fee'] = round($order['total_fee'] * (1 - $店铺折扣), 2); //实际支付金额 - 扣除积分 -贝壳等!!!!!!!!!!
                    break;
                case 'mix':
                    $order['score_fee'] = round($params['score'] * (1 - $店铺折扣), 2);
                    $order['shell_fee'] = round($params['shell'] * (1 - $店铺折扣), 2);
                    $order['score_money_fee'] =  round($使用积分*$this->getUserServerSet($this->auth->user()->id,$this->auth->user()->set_id,'score_server') * (1 - $店铺折扣) , 2) ; //积分服务费金额
                    $order['pay_fee'] = $order['total_fee'] - round($params['score'] * (1 - $店铺折扣), 2) - round($params['shell'] * (1 - $店铺折扣), 2) +$order['score_money_fee'];
                  


                    break;

                default:
                    # code...
                    break;
            }


            //地区
            $order['phone'] = $addr['tel'];
            $order['consignee'] = $addr['name'];
            $order['province_name'] = $addr['province'];
            $order['city_name'] = $addr['city'];
            $order['area_name'] = $addr['district'];
            $order['town_name'] = $addr['town'];

            $order['address'] = $addr['addr']; //详细地址

            $order['province_id'] = $addr['province_id'];
            $order['city_id'] = $addr['city_id'];
            $order['area_id'] = $addr['district_id'];
            $order['town_id'] = $addr['town_id'];
            $order['status'] = '0'; //订单状态:-2=交易关闭,-1=已取消,0=未支付,1=已支付,2=已完成
            $order['remark'] = $f_goods_list['remark']; //用户备注

            $order['platform'] = $params['platform'] ?: 'App';

            $order['createtime'] = time();
            $order['updatetime'] = time();
            $order['store_id'] = $store_id; //店铺ID

            if(isset($f_goods_list['coupons_id']))
            $order['coupons_id'] = isset($f_goods_list['coupons_id']) ? $f_goods_list['coupons_id'] : null; //店铺优惠券



            // $store_arr[$store_id]['total_amount'] = $order['total_amount']; //店铺总金额
            $order_ids[] = $this->CreateStoreOrder($order, $goods_list);
            // $all_price = $all_price + $order['total_amount']; //店铺总金额
        } //foreach($params['goods_json']




        $max_use_score = $this->UserUsableScore($订单优惠后总价, $this->auth->user()->set_id, $this->auth->user()->id);
        $score = (float)$this->auth->score();
        if ($max_use_score <= $score) {
            $usable_score = $max_use_score;
        } else {
            $usable_score = $score;
        }
        if ($使用积分 > $usable_score) {
            return $this->error('超过可使用积分', $使用积分, CODE_超过可使用积分);
        }

        $使用混合支付后支付金额 = $订单优惠后总价 - $使用积分 - $使用贝壳;
        if ($使用混合支付后支付金额 < 0) {
            return $this->error('超过可使用贝壳', $使用贝壳, CODE_超过可使用贝壳);
        }


        //用order_ids 在创建一个总订单用来支付
        $order_total['order_ids'] = implode(',', $order_ids);
        $order_total['user_id'] = $this->auth->user()->id;
        $order_total['order'] = rand_order('Total', $this->auth->user()->id);
        $order_total['money'] = $订单优惠后总价; //钱
        $order_total['pay_status'] = '1'; //支付状态:1=待支付,2=已支付,3=已退款,4=已超时
        $order_total['time'] = time();
        $order_total['pay_type'] = $params['pay_type']; //支付方式:wechat=微信支付,alipay=支付宝,wallet=钱包支付,score=积分支付,shell=贝壳支付,mix=混合支付



        $order_total['score_fee'] = $使用积分; //积分支付数

        $order_total['score_money_fee'] = $使用积分 * $this->getUserServerSet($this->auth->user()->id,$this->auth->user()->set_id,'score_server'); //积分服务费金额
        $order_total['shell_fee'] = $使用贝壳; //支付贝壳总数


        $order_total['pay_fee'] = $使用混合支付后支付金额 + $运费总价 + $order_total['score_money_fee']; ///实际支付金额  ??
        $order_total['pay_money'] = $order_total['pay_fee'] * 100; ///实际支付（分）  ??


        //总订单
        // `pay_time` int(10) DEFAULT NULL COMMENT '支付时间',

        // `pay_openid` varchar(32) DEFAULT NULL COMMENT '支付者openid',




        // `pay_update_time` int(10) DEFAULT NULL COMMENT '更新支付时间',
        // `gift_money` decimal(10,2) DEFAULT NULL COMMENT '抵扣金额',
        // `balance_money` decimal(10,2) DEFAULT NULL COMMENT '余额支付金额',

        //生成支付订单

        $order_total['id']  = $order_total_id = Db::name('order_total')->insert($order_total)->getLastInsertId();


        //定时器 多久后判断是否已经付款,未付款取消订单
        $timerId2 = \Imi\Timer\Timer::after((int)config('unpay_order_cancel_time') * 1000, function () use ($order_total_id) { //(int)config('unpay_order_cancel_time')
            $this->OrderTimeout($order_total_id);
        });

        $return_msg = '未知信息';
        $return_data = $order_total;
        $return_code = -9999;
        //去支付
        $Pay = new Pay;
        list($return_msg, $return_data, $return_code) = $Pay->pay_order_total($order_total);

        return $this->success($return_msg, $return_data, $return_code);
        // return $this->success('请支付', $order_total);
    }

    /**
     * 创建店铺订单信息
     *
     * @param array $store_order_data 店铺订单信息
     * @return void
     */
    public function CreateStoreOrder($store_order_data, $goods_list)
    {
        $order_id = Db::name('order')->insert($store_order_data)->getLastInsertId();
        //创建子订单
        foreach ($goods_list as $key => $val) {
            unset($item);
            $goods_price_data = $val['goods_price_data'];
            $goods = $this->GetGoodsDataById($goods_price_data['goods_id']);

            $item['user_id'] = $store_order_data['user_id'];
            $item['order_id'] = $order_id;
            $item['goods_id'] = $goods_price_data['goods_id'];
            $item['goodslog_id'] = $this->getNewGoodslogId($item['goods_id']);  //获取最新商品日志id          
            $item['goods_type'] = $goods['type']; //商品类型:normal=实体商品,virtual=虚拟商品
            $item['goods_sku_price_id'] = $val['goods_sku_price_id'];
            $item['goods_sku_text'] = $goods_price_data['goods_sku_text']; //规格名
            $item['goods_title'] = $goods['title'];
            $item['goods_image'] = $goods['image'];

            $item['goods_original_price'] = $goods_price_data['price']; //👉商品原价
            $item['discount_fee'] = 0; //👉使用了优惠券需要重新计算 优惠费用;

            $item['item_pay_fee'] = $val['goods_money']; //👉单件实际支付金额
            $item['goods_price'] = $goods_price_data['price']; //👉商品价格原价
            $item['goods_amount'] = $val['num'] * $goods_price_data['price']; //👉商品原价*数量 总价
            $item['pay_price'] = $val['num'] * $val['goods_money']; //👉支付金额(不含运费) 
            $item['total_fee'] = $val['num'] * $val['goods_money']; //👉最终支付金额
            $item['coupon_fee'] = $val['coupon_fee'];
            $item['discount_fee'] = $item['goods_amount'] - $item['pay_price']; //优惠费用

            $item['item_score_fee']  = $val['item_score_fee']; //单件积分支付数
            $item['item_shell_fee']  = $val['item_shell_fee']; //单件支付贝壳

            // `coupon_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '平台优惠券抵用金额',
            // `item_shell_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '单件支付贝壳总数',
            // `item_score_fee` decimal(11,2) NOT NULL DEFAULT '0.00' COMMENT '单件积分支付数',
            // `item_score_money_fee` decimal(11,2) NOT NULL DEFAULT '0.00' COMMENT '单件积分服务费金额',

            $item['dispatch_status'] = '0'; //0=未发货,1=已发货,2=已收货
            $item['goods_num'] = $val['num'];

            $item['store_id'] = $store_order_data['store_id'];
            // $item['dispatch_id'] = $goods['dispatch_id'];//发货模板
            $item['createtime'] = time();
            $item['updatetime'] = $item['createtime'];
            //减少库存 
            $this->DecGoodsStock($val['goods_sku_price_id'], $val['num'], '下单', $order_id);
            Db::name('order_item')->insert($item);
        }





        return $order_id;
    }

    //订单子订单
    // `activity_id` int(11) NOT NULL DEFAULT '0' COMMENT '活动 id',
    // `activity_type` varchar(255) DEFAULT NULL COMMENT '活动类型',
    // `item_goods_sku_price_id` int(11) NOT NULL DEFAULT '0' COMMENT '活动规格|积分商城规格 id',


    // `goods_weight` int(11) NOT NULL DEFAULT '0' COMMENT '商品重量',
    // `dispatch_fee` decimal(10,2) DEFAULT NULL COMMENT '发货费用',
    // `dispatch_type` varchar(20) DEFAULT NULL COMMENT '发货方式',
    // `dispatch_id` int(11) DEFAULT NULL COMMENT '发货模板',

    // `aftersale_status` tinyint(2) NOT NULL COMMENT '售后状态:-1=拒绝,0=未申请,1=申请售后,2=售后完成',
    // `comment_status` tinyint(2) NOT NULL COMMENT '评价状态:0=未评价,1=已评价',
    // `refund_status` tinyint(1) DEFAULT NULL COMMENT '退款状态:-1=拒绝退款,0=无,1=申请中,2=同意',
    // `refund_fee` decimal(10,2) DEFAULT NULL COMMENT '退款金额',
    // `refund_msg` varchar(255) DEFAULT NULL COMMENT '退款原因',
    // `express_name` varchar(60) DEFAULT NULL COMMENT '快递公司',
    // `express_code` varchar(60) DEFAULT NULL COMMENT '快递公司编号',
    // `express_no` varchar(60) DEFAULT NULL COMMENT '快递单号',
    // `ext` varchar(2048) DEFAULT NULL COMMENT '附加字段',










    //order表
    // `invoice_status` enum('-1','0','1') NOT NULL DEFAULT '-1' COMMENT '发票开具状态:-1=不可开具,0=未申请,1=已申请',
    // `memo` varchar(255) DEFAULT NULL COMMENT '商户备注',

    // `total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单总金额',
    // `score_amount` decimal(11,2) NOT NULL DEFAULT '0.00' COMMENT '积分总数',
    // `total_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '支付金额',
    // `last_total_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '改价前金额',
    // `discount_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣总金额',
    // `coupon_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '优惠券抵用金额',
    // `store_coupon_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '店铺优惠券抵用金额',
    // `activity_discount_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '活动优惠',
    // `dispatch_discount_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费优惠',
    // `pay_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '实际支付金额',
    // `shell_fee` decimal(10,2) DEFAULT '0.00' COMMENT '支付贝壳总数',
    // `score_fee` decimal(11,2) NOT NULL DEFAULT '0.00' COMMENT '积分支付数',
    // `score_money_fee` decimal(11,2) NOT NULL DEFAULT '0.00' COMMENT '积分服务费金额',
    // `goods_original_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品原价',

    // `transaction_id` varchar(60) DEFAULT NULL COMMENT '交易单号',
    // `payment_json` varchar(2500) DEFAULT NULL COMMENT '交易原始数据',
    // `pay_type` enum('wechat','alipay','wallet','score','shell','mix') DEFAULT NULL COMMENT '支付方式:wechat=微信支付,alipay=支付宝,wallet=钱包支付,score=积分支付,shell=贝壳支付,mix=混合支付',
    // `paytime` int(11) DEFAULT NULL COMMENT '支付时间',
    // `ext` varchar(2048) DEFAULT NULL COMMENT '附加字段',




}
